#include "04_Acceptor.hpp"
#include "05_TCPconnection.hpp"
#include <stdlib.h> // exit
#include <iostream>
#include <csignal>

// 处理ctrl + c信号，优雅退出
void signal_handler(int signum)
{
    std::cout << "Server shutdown..." << std::endl;
    exit(0);
}

int main()
{
    // 0. 注册信号处理函数（好像只有优雅退出）
    signal(SIGINT, signal_handler); 

    // 1. 创建Acceptor对象，准备接受连接
    //xy::Acceptor acceptor(8080, "127.0.0.1");   // 使用端口和本地回环地址，测试阶段推荐
    xy::Acceptor acceptor(8080, "0.0.0.0");   // 使用端口和本地回环地址，测试阶段推荐
    //acceptor.ready();   // 先设置复用，再调用ready(), 内部会调用bind()和listen()

    // 2. 设置地址和端口复用，这次是真的准备接受连接了
    acceptor.SetReuseAddr(true);
    acceptor.SetReusePort(true);
    acceptor.ready();   // 先设置复用，再调用ready(), 内部会调用bind()和listen()

    std::cout << "Server running on port 8080...\n";

    // 3. 顺便加个循环，接受多个客户端连接
    while(true)
    {
        // 3.1 接受客户端连接并创建TCPconnection对象处理
        int client_fd = acceptor.accept();
        //xy::TCPconnection tcp_conn(8080);
    
        // 3.2  创建 TCPconnection 对象处理连接
        xy::TCPconnection tcp_conn(client_fd);
        std::cout << "New connection: " << tcp_conn.tostring() << std::endl;

        // 3.3 顺便加个循环，与客户端持久通信
        while(true)
        {
            std::cout << tcp_conn.tostring() << "\n";
            std::string client_msg = tcp_conn.receive();
            printf("Received fron client: %s\n", client_msg.c_str());
            tcp_conn.send("Hello from server!");

        }

        // 4. 关闭连接，但好像放错地方了
        tcp_conn.shutdown();
        std::cout << "Connection closed\n";
    }

    // 6. 关闭连接，但好像放错地方了
    //tcp_conn.shutdown();
    //std::cout << "Connection closed\n";

    return 0;
}

